package jm.nj.demo16main.demoProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;

/*
* 定义接口InvocationHandler的实现类对象
 * 		重写接口中的方法invoke
 * 		对集合的方法进行判断,size,get允许执行;add,remove,set不允许执行,抛出异常
 *
 * InvocationHandler接口中的方法
 * Object invoke (Object  proxy, Method method,Object[] args)  在代理实例上处理方法调用并返回结果
 * 参数
 * Object proxy  :创建代理对象
 * Method method:集合中的方法(add,remove,size,get)的反射类型
 * 返回值
 * Object:调用集合中的方法,方法的返回值
 *
 * 注意事项:
 * InvocationHandler类中不知道操作的是哪个集合对象
 * 所以必须要把代理的集合对象传递的类中
 * 定义一个List集合类型的变量,通过带参构造方法,给成员变量赋值
 *
 *
* */
public class InvocationHandlerImpl implements InvocationHandler {
    private List<String> proxyList;

    //只要创建代理人对象,就必须要传递代理的list集合

    public InvocationHandlerImpl(List<String> proxyList) {
        this.proxyList = proxyList;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //获取方法名字
        String methodName = method.getName();
        //对集合的方法进行判断
        //add,remove,set不允许执行,抛出异常
        if("add".equals(methodName)){
            throw new RuntimeException("add NO Run");
        }
        if("remove".equals(methodName)){
            throw new RuntimeException("remove NO Run");
        }
        if("set".equals(methodName)){
            throw new RuntimeException("set NO Run");
        }

        //size,get允许
        Object obj = method.invoke(proxyList,args);
        System.out.println(45645);

        return obj;
    }
}
